﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using MIAP.Negocio.Properties;
using Microsoft.Exchange.WebServices.Data;


namespace MIAP.Negocio.Utiles
{
    public class EnvioCorreoNegocio
    {
        #region Constantes

        #endregion

        #region Campos

        readonly ExchangeService _service;

        #endregion

        #region Constructor

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="user">usuario de dominio</param>
        /// <param name="password">password de dominio</param>
        /// <param name="dominio">dominio al que se tiene que conectar</param>
        /// <param name="from">direccion de la cual se enviaran los correos</param>
        public EnvioCorreoNegocio(string user, string password, string dominio, string from)
        {
            this._service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

            _service.UseDefaultCredentials = true;
            _service.Credentials = new NetworkCredential(user, password, dominio);
            _service.AutodiscoverUrl(from, RedirectionUrlValidationCallback);

        }

        /// <summary>
        /// valida si se puede conectar con el servidor de correo antes de enviar el correo
        /// </summary>
        /// <param name="user">usuario de dominio</param>
        /// <param name="password">password de dominio</param>
        /// <param name="dominio">dominio al que se tiene que conectar</param>
        /// <param name="from">direccion de la cual se enviaran los correos</param>
        /// <returns>true si se puede conectar, false en caso contrario</returns>
        public static bool CanAccesExchange(string user, string password, string dominio, string from)
        {
            try
            {
                var service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
                service.UseDefaultCredentials = true;
                service.Credentials = new NetworkCredential(user, password, dominio);
                service.AutodiscoverUrl(from, RedirectionUrlValidationCallback);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Evia el correo de solicitud de recarga a la lista de archivos proporcionados
        /// </summary>
        /// <param name="listAddressTo">lista de correos de la cual mandaremos</param>
        /// <param name="nombreArchivo">Nombre del archivo que se requiere realizar la recarga</param>
        public void EnviaCorreoSolicitud(IEnumerable<string> listAddressTo, string nombreArchivo)
        {
            var body = String.Format(Strings.BodySolicitud, nombreArchivo);

            this.EnviarCorreo(listAddressTo, body, Strings.SubjectSolicitud);
        }

        /// <summary>
        /// Envia correo de respuesta de la solicitud
        /// </summary>
        /// <param name="addressTo">direccion a donde enviaremos la respuesta (solicitante)</param>
        /// <param name="esAutorizado">true si la solicitud es autorizada, false en caso contrario</param>
        /// <param name="nombreArchivo">Nombre del archivo del cual se envia la solicitud</param>
        /// <param name="comentarios">comentarios que el autorizador indica.</param>
        public void EnviaCorreoRespuestaSolicitud(string addressTo, bool esAutorizado, string nombreArchivo, string comentarios)
        {
            var body = String.Format(esAutorizado ? Strings.BodyRespuestaAutorizado : Strings.BodyRespuestaCancelado,
                nombreArchivo, comentarios);

            this.EnviarCorreo(new List<string> { addressTo }, body, Strings.SubjectSolicitud);
        }

        /// <summary>
        /// Metodo principal de envio del correo
        /// </summary>
        /// <param name="listAddressTo">Lista de direcciones a la cual se le mandaran los coreos</param>
        /// <param name="body">cuerpo del mensaje</param>
        /// <param name="subject">Asunto del mensaje</param>
        public void EnviarCorreo(IEnumerable<string> listAddressTo, string body, string subject)
        {

            var emailMessage = new EmailMessage(_service)
                {
                    Subject = subject,  
                    Body = body
                };
            foreach (var address in listAddressTo.Where(elemento => !String.IsNullOrEmpty(elemento)).Distinct().ToList())
            {
                emailMessage.ToRecipients.Add(address);
            }
            if (emailMessage.ToRecipients.Count > 0)
            {
                emailMessage.Send();
            }


        }

        /// <summary>
        /// Metodo utilizado para la validacion de la URL
        /// </summary>
        /// <param name="redirectionUrl"></param>
        /// <returns></returns>
        private static bool RedirectionUrlValidationCallback(string redirectionUrl)
        {
            // The default for the validation callback is to reject the URL.
            bool result = false;

            var redirectionUri = new Uri(redirectionUrl);

            // Validate the contents of the redirection URL. In this simple validation
            // callback, the redirection URL is considered valid if it is using HTTPS
            // to encrypt the authentication credentials. 
            if (redirectionUri.Scheme == "https")
            {
                result = true;
            }
            return result;
        }

        #endregion
    }
}
